/*******************************************************************************
 * Copyright (c) 2009 Ravenhearte Design.
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * 	*	Redistributions of source code must retain the above copyright
 * 		notice, this list of conditions and the following disclaimer.
 * 
 * 	*	Redistributions in binary form must reproduce the above copyright
 * 		notice, this list of conditions and the following disclaimer in the
 * 		documentation and/or other materials provided with the distribution.
 * 
 * 	*	Neither the name of 'Ravenhearte Design' nor the names of its contributors 
 * 		may be used to endorse or promote products derived from this software 
 * 		without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ******************************************************************************/

package org.ravenhearte.engine.modes;

import org.ravenhearte.engine.GameMode;
import org.ravenhearte.engine.SphericalBoundCamera;
import org.ravenhearte.engine.guis.EditModeGUI;
import org.ravenhearte.engine.helpers.GeometryXRayer;
import org.ravenhearte.engine.input.*;
import org.ravenhearte.engine.input.InputEvent.EventType;
import org.ravenhearte.engine.input.InputEventManager.Queue;
import org.ravenhearte.gameplay.concepts.locations.World;

import com.jme.input.KeyInput;
import com.jme.math.Vector3f;
import com.jme.renderer.Camera;
import com.jme.scene.Node;
import com.jme.system.DisplaySystem;

public class EditMode extends GameMode {
	SphericalBoundCamera camera;
	GeometryXRayer xRay;
	boolean xrayToggle;

	public EditMode(World world) {
		node = new Node("Edit Mode Node");
		node.attachChild(world.getNode());
		// node.setLightCombineMode(Spatial.LightCombineMode.Off);
		
		gui = new EditModeGUI();

		Camera cam = DisplaySystem.getDisplaySystem().getRenderer().getCamera();
		Vector3f startLoc = Vector3f.ZERO;
		Vector3f offsets = new Vector3f(-40, 0, 40);
		camera = new SphericalBoundCamera(cam, startLoc, offsets);

		xRay = new GeometryXRayer(node);
		xrayToggle = false;
		
		loadEvents();
		
		node.updateGeometricState(0.0f, true);
		node.updateRenderState();
	}

	@Override
	public void update(float tpf) {
		camera.update(tpf);
		node.updateGeometricState(tpf, true);
		gui.getNode().updateGeometricState(tpf, true);
	}
	
	private void loadEvents() {
		InputEvent evnt = new InputEvent();
		evnt.parent = this;
		evnt.id = KeyInput.KEY_Z;
		evnt.type = EventType.KEYUP;
		InputEventManager.eM.registerEvent(Queue.WORLD, evnt);
	}

	@Override
	public void unloadEvents() {
		camera.unloadEvents();
		xRay.unloadEvents();
		InputEventManager.eM.unregisterEvents(this);
	}

	@Override
	public boolean onEvent(InputEvent ev) {
		switch (ev.type) {
		case KEYUP:
			switch (ev.id) {
			case KeyInput.KEY_Z:
				if(xrayToggle) {
					xRay = new GeometryXRayer(node);
					xrayToggle = false;
				}
				else {
					xRay.unloadEvents();
					xrayToggle = true;
				}
				return true;
			}
		}
		return false;
	}
}
